package cndw.core.dispatch;

import io.netty.channel.Channel;

/**
 * 一次连接会话
 * 
 * @author zuojie.x
 */
public interface Session {
	
	/**
	 * 设置玩家Id<br/>
	 * @param playerId
	 */
	void setPlayerId(String playerId);

	/**
	 * <ul>
	 * <li>在socket连接后创建会话,但这个时候还没有用户ID</li>
	 * <li>在需要登录验证时将判断{@link #getPlayerId()}是否等于null</li>
	 * </ul>
	 * 
	 * @return 用户的ID,在没有设置用户ID时,返回null
	 */
	String getPlayerId();
	
	/**
	 * @return 会话的通道
	 */
	Channel getChannel();
	
	/**
	 * 通过判断{@link #getPlayerId()}是否等于null来决定是否已登陆
	 * 
	 * @return 是否登陆成功
	 */
	boolean isLogin();

	/**
	 * 设置键和值关联并保存在会话中
	 * 
	 * @param key
	 * @param value
	 * @return 如果之前存在与key关联的值,那么返回之前与指定key关联的值,否则返回null
	 */
	<T> T setAttribute(Object key, T value);

	/**
	 * 获取与指定key关联的值
	 * 
	 * @param key
	 * @param clazz
	 * @return 与指定key关联的值
	 */
	<T> T getAttribute(Object key, T clazz);

	/**
	 * 删除与指定key关联的值
	 * 
	 * @param key
	 * @return 被删除的值
	 */
	<T> T removeAttribute(Object key);
	
	/**
	 * 删除所有已存在的键和值
	 */
	void removeAllAttribute();
}
